<?php
class Gest_imagenes extends MY_Controller {

	var $ruta_adjuntos = './documentos/';

	public function __construct()
    {
    	# Al constructor le envío la clase Controlador, y el nombre de la entidad gestionada
    	parent::__construct(get_class($this), 'gest_adjunto');

    	$this->title = 'Contenido :: Imágenes';
		$this->CARPETA_VISTAS = 'contenido/';
		$this->nombre_entidad = 'Imagen';
		$this->nombre_entidad_plural = 'Imágenes';

		$this->pagina_editar = $this->CARPETA_VISTAS . 'imagenes_edit_view';
		$this->pagina_ver = $this->CARPETA_VISTAS . 'imagenes_ver_todos_view';
		$this->pagina_filtros_ver = $this->CARPETA_VISTAS . 'imagenes_filtros_ver_todos_view';

		$this->exportarExcelPermitido = FALSE;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Crea un objeto de la entidad correspondiente y lo pobla con la información obtenida a 
	 * partir del formulario recibido a través de POST.	*/
	protected function getObjetoDesdeForm()
	{
		$idEntidad = is_numeric($this->input->post('txt_id')) ? $this->input->post('txt_id') : NULL;
		
		$objEntidad = $this->getObjeto($idEntidad);
		$objEntidad->titulo = $this->input->post('txt_titulo');
		$objEntidad->en_slider = $this->input->post('chk_en_slider');
		$objEntidad->destacada = $this->input->post('chk_destacada');

		$datos['objEntidad'] = $objEntidad;

		$id_cont = is_numeric($this->input->post('txt_contenido')) ? $this->input->post('txt_contenido') : NULL;
		$datos['objRelacionados'] = array(new Gest_contenido($id_cont));

		return $datos;
	}

	/* IMPORTANTE: DEBE existir esta función. 
	 * Carga en el arreglo que luego se pasarán a las vistas, los datos correspondientes a otras entidades que se
	 * necesiten. Por ejemplo, en este método deben cargarse las entidades a las que puede asociarse o relacionarse
	 * la entidad actual. Si no se requiriesen, no se agrega nada. */
	protected function cargarDatosRelacionados($dataView)
	{
		return $dataView;
	}


	/* Método para cargar los formularios de creación y actualización de la información de los registros. */
	public function editar($id_elemento = NULL)
	{
		$objEntidad = $this->getObjeto($id_elemento);
		if(!$objEntidad->exists()) {
			$dataView['objEntidad'] = $objEntidad;

			# Datos requeridos por las vistas
			$controlador = strtolower($this->nombre_controlador);
			$dataView['nombre_controlador'] = $controlador;
			$dataView['metodo_guardar'] = 'subir_archivo';
			$dataView['metodo_subir_archivo'] = "cargarArchivo_imagen(this.form.id, '$controlador')";
			
			$dataView = $this->cargarDatosRelacionados($dataView);
			parent::_loadFileUploadView($dataView, FALSE);
		}
		else parent::editar($id_elemento);
	}

	public function subir_archivo()
	{
		$config['upload_path'] = $this->ruta_adjuntos;
		$config['allowed_types'] = 'gif|jpg|jpge|png';
		$config['file_name'] = 'img_libres';
		
		$this->load->library('upload', $config);
		if (!$this->upload->do_upload()) 
			$dataView['error'] = $this->upload->display_errors();
		else {
			$dataView = $this->getObjetoDesdeForm();
			$datos_archivo = $this->upload->data();
			$dataView['objEntidad']->archivo = $datos_archivo['file_name'];
			if(!$datos_archivo['is_image'] || !$dataView['objEntidad']->destacada ||
				$dataView['objEntidad']->gest_contenido_id == NULL || $dataView['objEntidad']->gest_contenido_id == 0) $dataView['objEntidad']->destacada = FALSE;

			//$dataView = parent::guardarEntidad($dataView);
			$dataView = $this->guardarEntidad($dataView);
		}

		parent::ver_todos($dataView);
	}

	public function guardarEntidad($dataView = array())
	{
		if($dataView == array()){
			$datos = $this->getObjetoDesdeForm();
			$objEntidad = $dataView['objEntidad'] = $datos['objEntidad'];
			$objRelacionados = $datos['objRelacionados'];
		}
		else
		{
			$objEntidad = $dataView['objEntidad'];
			$objRelacionados = $dataView['objRelacionados'];
			
			$datos = array();
			$datos['objEntidad'] = $objEntidad;
			$datos['objRelacionados'] = $objRelacionados;
		}

		# Se manejan transacciones para interactuar con la BD
		$objEntidad->trans_begin();
		$operacion_exitosa = $objEntidad->save($objRelacionados);
		if(!$operacion_exitosa && !$this->validarForm($dataView))
		{ 
			# Falló la validación de datos de acuerdo a las reglas de los modelos
			$dataView['error'] = $objEntidad->error->string; 
		}
		else
		{
			if ($objEntidad->trans_status() === FALSE) # Si la transacción falló, hago un rollback 
				$objEntidad->trans_rollback();
			else {
				if($objEntidad->destacada){
	                // Si se marcó la imagen como destacada (y se trata efectivamente de una imagen), borro cualquier otra
					// que pudiera estar previamente como destacada
	                $adjuntos_no_favoritos = $this->getObjeto();
	                $adjuntos_no_favoritos->where('gest_contenido_id', $objEntidad->gest_contenido_id);
	                $adjuntos_no_favoritos->where('id !=', $objEntidad->id);
	                $adjuntos_no_favoritos->update('destacada', FALSE);
	            }

				# Transacción exitosa, realizo el commit 
				$objEntidad->trans_commit();
			}

			# Almaceno todos los errores que hubieran podido ocurrir
			$dataView['error'] = $objEntidad->error->string;
			$dataView['objEntidad'] = $objEntidad;
		}

		return $dataView;
	}


	public function eliminar($id_elemento)
	{
		$dataView['title'] = 'Borrar adjunto';
		$dataView['error'] = '';

		# Se obtiene el objeto que se desea eliminar
		$objEntidad = $this->getObjeto($id_elemento);
		if($this->validarEliminacion($id_elemento))
		{
			$path_archivo = $this->ruta_adjuntos . trim($objEntidad->archivo);

			# Se manejan transacciones para interactuar con la BD
			$objEntidad->trans_begin();
			$objEntidad->delete();
			if ($objEntidad->trans_status() === FALSE) { # Se chequea el estado de la transacción. Si falló, hago un rollback
			    $objEntidad->trans_rollback(); 
			    $dataView['error'] .= $objEntidad->error->string;
			}
			else { 
				# Transacción exitosa, trato de borrar el archivo del servidor
				$borrado = unlink($path_archivo);
				if($borrado){
					$objEntidad->trans_commit();
				}
				else {
					$dataView['error'] = 'Ocurrió un error al intentar borrar el archivo del servidor. </br>' . $objEntidad->error->string;
					$objEntidad->trans_rollback();
				}
			}
		}
		else $dataView['error'] = 'No se puede eliminar el elemento elegido.';

		parent::ver_todos($dataView);
	}


	/* IMPORTANTE: DEBE existir esta función. 
	 * Obtiene el listado de elementos de acuerdo a los filtros que se hayan establecido y enviado a través
	 * del método POST. Devuelve un detalle de los filtros aplicados (o vacío si no hubiera filtros)	*/	
	protected function _aplicarFiltros($dataView = array())
	{
		$objEntidad = $this->getObjeto();
		$detalle_filtros = '';

		$objEntidad->where("(archivo LIKE '%.png' OR archivo LIKE '%.jpge' OR archivo LIKE '%.jpg' OR archivo LIKE '%.gif')");

		$titulo = trim($this->input->post('f_txt_titulo'));
		if(!empty($titulo)) { 
			$objEntidad->like_related_gest_contenido('titulo', $titulo); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Título => ' . $titulo;
		}

		$en_slider = trim($this->input->post('f_chk_en_slider'));
		if($en_slider) { 
			$objEntidad->where('en_slider', TRUE); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'En Slider Principal ';
		}

		$destacada = trim($this->input->post('f_chk_destacada'));
		if($destacada) { 
			$objEntidad->where('destacada', TRUE); 
			$detalle_filtros .= (!empty($detalle_filtros) ? ' | ' : '') . 'Imágenes destacadas ';
		}
		
		$dataView['objEntidad'] = $objEntidad;
		$dataView['detalle_filtros'] = $detalle_filtros;

		return $dataView;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda ELIMINARSE. */
	protected function validarEliminacion($id_elemento)
	{
		return TRUE;
	}

	/* IMPORTANTE: DEBE existir esta función.
	 * Valida las condiciones que deben cumplirse para que un elemento pueda EDITARSE. */
	protected function validarEdicion($id_elemento)
	{
		return TRUE;
	}
}